package com.eduagent.xwqeduagent.controller;

import com.eduagent.xwqeduagent.api.IntelligentPPTGeneration.api.PPTCreator;
import com.eduagent.xwqeduagent.api.IntelligentPPTGeneration.api.PPTDirectCreator;
import com.eduagent.xwqeduagent.api.IntelligentPPTGeneration.api.PPTDocOutlineGenerator;
import com.eduagent.xwqeduagent.api.IntelligentPPTGeneration.api.PPTOutlineGenerator;
import com.eduagent.xwqeduagent.api.IntelligentPPTGeneration.api.PPTProgressChecker;
import com.eduagent.xwqeduagent.api.IntelligentPPTGeneration.api.PPTThemeListQuery;
import com.eduagent.xwqeduagent.api.IntelligentPPTGeneration.dto.*;
import com.eduagent.xwqeduagent.common.BaseResponse;
import com.eduagent.xwqeduagent.common.ResultUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

/**
 * PPT相关接口控制器
 */
@Slf4j
@RestController
@RequestMapping("/ppt")
@RequiredArgsConstructor
public class PPTController {

    private final PPTThemeListQuery pptThemeListQuery;
    private final PPTOutlineGenerator pptOutlineGenerator;
    private final PPTDocOutlineGenerator pptDocOutlineGenerator;
    private final PPTCreator pptCreator;
    private final PPTDirectCreator pptDirectCreator;
    private final PPTProgressChecker pptProgressChecker;
    
    /**
     * 获取PPT主题列表
     *
     * @param request 请求参数
     * @return 主题列表
     */
    @PostMapping("/theme/list")
    public BaseResponse<PPTThemeListResponse> getPPTThemeList(@RequestBody PPTThemeListRequest request) {
        log.info("获取PPT主题列表, 请求参数: {}", request);
        PPTThemeListResponse response = pptThemeListQuery.queryPPTThemeList(request);
        return ResultUtils.success(response);
    }
    
    /**
     * 生成PPT大纲
     *
     * @param request 请求参数
     * @return 大纲内容
     */
    @PostMapping("/outline/generate")
    public BaseResponse<PPTOutlineResponse> generatePPTOutline(@RequestBody PPTOutlineRequest request) {
        log.info("生成PPT大纲, 请求参数: {}", request);
        PPTOutlineResponse response = pptOutlineGenerator.generateOutline(request);
        return ResultUtils.success(response);
    }
    
    /**
     * 基于文档生成PPT大纲
     *
     * @param request 请求参数
     * @param file    上传的文件（可选，如果使用fileUrl则不需要）
     * @return 大纲内容
     */
    @PostMapping("/outline/generate-by-doc")
    public BaseResponse<PPTOutlineResponse> generatePPTOutlineByDoc(
            @ModelAttribute PPTDocOutlineRequest request,
            @RequestPart(value = "file", required = false) MultipartFile file) {
        log.info("基于文档生成PPT大纲, 请求参数: {}, 文件名: {}", request, 
                file != null ? file.getOriginalFilename() : "使用fileUrl");
        
        // 如果未指定文件名但上传了文件，则使用上传文件的原始文件名
        if ((request.getFileName() == null || request.getFileName().isEmpty()) && file != null) {
            request.setFileName(file.getOriginalFilename());
        }
        
        PPTOutlineResponse response = pptDocOutlineGenerator.generateOutlineByDoc(request, file);
        return ResultUtils.success(response);
    }
    
    /**
     * 通过大纲生成PPT
     *
     * @param request 请求参数
     * @return PPT生成结果
     */
    @PostMapping("/create")
    public BaseResponse<PPTCreateResponse> createPPTByOutline(@RequestBody PPTCreateByOutlineRequest request) {
        log.info("通过大纲生成PPT, 请求参数: {}", request);
        PPTCreateResponse response = pptCreator.createPPTByOutline(request);
        return ResultUtils.success(response);
    }
    
    /**
     * 直接生成PPT（无需先生成大纲）
     *
     * @param request 请求参数
     * @param file    上传的文件（可选，如果使用query或fileUrl则不需要）
     * @return PPT生成结果
     */
    @PostMapping("/direct-create")
    public BaseResponse<PPTCreateResponse> createPPTDirect(
            @ModelAttribute PPTDirectCreateRequest request,
            @RequestPart(value = "file", required = false) MultipartFile file) {
        log.info("直接生成PPT, 请求参数: {}, 文件名: {}", request, 
                file != null ? file.getOriginalFilename() : "使用query或fileUrl");
        
        // 如果未指定文件名但上传了文件，则使用上传文件的原始文件名
        if ((request.getFileName() == null || request.getFileName().isEmpty()) && file != null) {
            request.setFileName(file.getOriginalFilename());
        }
        
        PPTCreateResponse response = pptDirectCreator.createPPTDirect(request, file);
        return ResultUtils.success(response);
    }
    
    /**
     * 查询PPT生成进度
     *
     * @param sid 请求唯一ID
     * @return 进度查询结果
     */
    @GetMapping("/progress")
    public BaseResponse<PPTProgressResponse> checkProgress(@RequestParam String sid) {
        log.info("查询PPT生成进度, SID: {}", sid);
        PPTProgressResponse response = pptProgressChecker.checkProgress(sid);
        return ResultUtils.success(response);
    }
} 